package 设计模式.Dynamicproxy.JDK;


import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 代理角色
 */
public class ProxyInvocationHandler implements InvocationHandler {

    private Rent rent;


    /**
     * 设置对象
     */
    public void setRent(Rent rent) {
        this.rent = rent;
    }

    //看房 ,增强方法
    public void seeHouse() {
        System.out.println("带房客看房");
    }

    //收中介费 ,增强方法
    public void fare() {
        System.out.println("收中介费");
    }


    //生成代理类，重点是第二个参数，获取要代理的抽象角色！之前都是一个角色，现在可以代理一类角色
    public Object getProxy() {
        return Proxy.newProxyInstance(this.getClass().getClassLoader(), rent.getClass().getInterfaces(), this);
    }


    // proxy : 代理类 method : 代理类的调用处理程序的方法对象.
    // 处理代理实例上的方法调用并返回结果
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        seeHouse();
        // 使用反射创建对象
        Object invoke = method.invoke(rent, args);
        fare();
        return invoke;
    }
}
